// 雷泽极限解析
// 武器推荐  狼末/无工 > 天空 >  骨剑  >  古华  >  霜葬  
// 90级面板
// 白值:234, 暴击率:5, 暴击伤害:50, 物理伤害加成: 30

// 命座效果  吃能量球后8秒内10增伤  对付敌人生命小于30%的暴击+10 e点按降低防御15  满命10秒一次雷劈

// 狼末跟无工 都是608白值 49.6攻击力  特效40攻击力(无工需砍人叠) 
// 需要主动触发的效果 无工有盾攻击力额外+40  狼末打残血触发buff攻击力额外+80
// 天空想有伤害得大招后触发真空刃
// 骨剑怕被打掉层,需要套盾的角色保护
// 古华霜葬  霜葬需要保证敌人冰附着才能接近古华

// 圣遗物选择角斗士4  攻击力18% 普攻增伤35%
// 初始副词条取最优 攻攻双暴 攻双暴 攻双暴 攻攻双暴 攻攻爆  // 副词条效果与主词条效果不重复 每个圣遗物5次强化副词条全排列取最优结果 

// 单人输出手法 eqeaaaa aaaae aaaa aaaae aaaa  大概15s
// e吃能量球增伤 降低防御 qe  砍人会触发一次满命雷劈,相当于攻击力的雷伤,古华效果是攻击力x4.8的物理伤,享受物理加成
// 霜葬跟天空真空刃我没测试 猜测是跟古华一样的物理伤 
// 大招狼魂是 攻击力*普攻倍率*狼魂转化倍率的雷伤

// 下面伤害都是算的暴击期望平均伤害  天赋取10级

// 霜葬 565面板 34.5%物理加成   技能:10s 一次 攻击力 x 1.4/3.6(敌人被冰附着)物理伤害
// 圣遗物 攻击 物理 暴击    副词条强化搭配   暴击率:46.8(12)  暴击伤害:101.4(13) 
// 数值 攻击力 1887.5  暴击98.5  爆伤190.4
// 122.8物理增伤   35普攻增伤(角斗士)
// e点按 8768  触发命座增伤和减防果
// 后续伤害是按照 10增伤 15减防御算的
// 后续e伤害 10426
// q爆发 8364
// 普攻一套 52678
// 狼魂普攻一套 9347
// 六命雷劈  2904
// 武器特效  7330
// 总 373896
// 如果敌人保证冰附着的话 武器特效伤害为 18849  总: 391174



// 古华 565面板 27.6%攻击加成   技能:15s 一次 攻击力 x 4.8物理伤害
// 圣遗物 攻击 物理 暴击    副词条强化搭配   暴击率:46.8(12)  暴击伤害:101.4(13) 
// 数值 攻击力 2108  暴击98.5  爆伤190.4
// 88.3物理增伤   35普攻增伤(角斗士)
// e点按 9792  触发命座增伤和减防果
// 后续伤害是按照 10增伤 15减防御算的
// 后续e伤害 11645
// q爆发 9342
// 普攻一套 51253
// 狼魂普攻一套 10439
// 六命雷劈  3243
// 武器特效  28068
// 总 395471      普攻比不上霜葬 其他高于霜葬

// 骨剑 510面板 27.6%暴击   50增伤(满层)
// 圣遗物 攻击 物理 暴伤    副词条强化搭配  攻击力:11.6(2) 暴击率:46.8(12)  暴击伤害:85.8(11) 
// 数值 攻击力 1870  暴击98.9  爆伤229.2
// 88.3物理增伤   35普攻增伤(角斗士)  50武器增伤
// e点按 9871  触发命座增伤和减防果
// 后续伤害是按照 10增伤 15减防御算的
// 后续e伤害 11739
// q爆发 9417
// 普攻一套 62742
// 狼魂普攻一套 10524
// 六命雷劈  3270
// 总 425745       需要盾保护 防止掉层

// 天空之傲 674面板 16增伤 充能36.8(雷泽不怎么需要充能) 大招后8次真空刃 攻击力x1.6 物理伤害 
// 圣遗物 攻击 物理 暴伤    副词条强化搭配  暴击率:46.8(12)  暴击伤害:101.4(13) 
// 数值 攻击力 2092  暴击98.5  爆伤190.4
// 88.3物理增伤   35普攻增伤(角斗士)  16武器增伤
// e点按 9718  触发命座增伤和减防果
// 后续伤害是按照 10增伤 15减防御算的
// 后续e伤害 11557
// q爆发 9271
// 普攻一套 54357
// 狼魂普攻一套 10361
// 六命雷劈  3219
// 真空刃  80281
// 总 382088 + 80281(真空刃)     有真空刃就强 没有就垃圾

// attack: 2722.708,
// eonce: 12647.72283055056,
// edmg: 15040.535257952017,
// qdmg: 12065.944719471257,
// yl: 4189.564138705298,
// admg: 66198.35078201453,
// qadmg: 13483.693224009128,

// 狼末跟无工 608面板 49.6攻击 40攻击 // 额外特效无工40攻击  狼末80攻击
// 圣遗物 攻击 物理 暴伤    副词条强化搭配  暴击率:46.8(12)  暴击伤害:101.4(13) 
// 数值 攻击力 2722  暴击98.5  爆伤190.4
// 88.3物理增伤   35普攻增伤(角斗士)  
// e点按 12647  触发命座增伤和减防果
// 后续伤害是按照 10增伤 15减防御算的
// 后续e伤害 15040
// q爆发 12065
// 普攻一套 66198
// 狼魂普攻一套 13483
// 六命雷劈  4189
// 总 474529    无工全程带盾 533229    狼末全程buff 591928


// 超导提升  以狼末无工不带盾和触发buff的数值为参考
// 普攻一套 66198 (敌人物理抗性为10)      总 474529
// 超导减抗40 (-30) 后伤害  84586   总 566471
// 敌人为愚人众时(-20)  超导后(-60)  普攻一套 95619  总: 621637

let charaters = {
    leize : {
        name: "lv90雷泽", 
        base: 234,
        criticalRate: 5,
        criticalStrike: 50,
        dmgRate: 30
    }
}

let weapons = {
    wugong: {
        name:"lv90无工之剑",
        base: 608,
        attRate: 49.6 + 40  // 有护盾额外加40
    },
    tkDj: {
        name:"lv90天空之傲", // q后普攻8次攻击力x1.6 真空刃
        dmgRate: 16,
        base: 674,
        充能: 36.8
    },
    langmo: { 
        name:"lv90狼末",
        base: 608,
        attRate: 49.6 + 40   // 触发buff 额外加80
    },
    langmo: { 
        name:"lv90狼末",
        base: 608,
        attRate: 49.6 + 40   // 触发buff 额外加80
    },
    gh: {
        name:"lv90古华",  // 15s 一次 攻击力x4.8 伤害
        base: 565,
        attRate: 27.6
    },
    sz: {
        name:"lv90霜葬",  // 10s 一次 1.4/3.6(敌人被冰附着) * 1.5(15s输出率) 
        base: 565,
        dmgRate: 34.5
    },
    cg:{
        name:"lv90骨剑",
        base: 510,
        criticalRate: 27.6,
        dmgRate:50
    },
}
let normal_clips = calc_clips_normal();
let normal_clips2 = calc_clips_normal(2);
let charactersDmg = []

// 雷泽 无工/狼末
charactersDmg.push(getDMG([charaters.leize,weapons.wugong,{fixedAtt:311,criticalRate:31.1,dmgRate:58.3,attRate:46.6},normal_clips], (data,second) => {
    // 脚斗士四件套
    data.attRate += 18;
    data.dmgRate += 35;
    let attack = data.base *(1 + data.attRate/100) + data.fixedAtt
    let eonce = getDmgDps({...data,dmgRate:0}, 3.59) * q(10) * df(90,90); // 第一次e
    let qdmg = getDmgDps({...data,dmgRate:10}, 2.88) * q(10) * df(90,90,15); // 大招
    let edmg = getDmgDps({...data,dmgRate:10}, 3.59) * q(10) * df(90,90,15); // 后续减防御e
    let yl = getDmgDps({...data,dmgRate:10}, 1) * q(10) * df(90,90,15);  // 六命雷劈
    let admg = getDmgDps({...data,dmgRate:data.dmgRate+10}, 1.71+1.47+1.84+2.43) * q(-60) * df(90,90,15);  // 普攻一套
    let qadmg = getDmgDps({...data,dmgRate:10}, (1.71+1.47+1.84+2.43)*0.432) * q(10) * df(90,90,15); // 替身使者
    let ret = eonce + qdmg + edmg*3 + yl*1.5 + admg*5 +qadmg*5
    return {point:ret, data, second, attack , eonce,edmg,qdmg,yl, admg,qadmg, msg:"狼末无工"}
}))
console.log(charactersDmg.sort((a,b)=>b.point-a.point));


function getDMG(dataarr, getRet){
    let chance = 25;
    let _ret = [];
    for (let index = 0; index <= chance; index++) {
        let criticalStrike = index; 
        for (let index2 = 0; index2 <= chance - index; index2++) {
            let criticalRate = index2;
            for (let index3 = 0; index3 <= chance-index-index2; index3++) {
                let attRate = index3;
                let defenceRate = chance - index - index2 - index3;
                _ret.push({
                    defenceRate: 7.3 * defenceRate,
                    attRate:5.8 * attRate,
                    criticalRate:3.9 * criticalRate,
                    criticalStrike:7.8 * criticalStrike
                });
            }
        }
    }
    _ret = _ret.map(second => {
        let panel = getPanel([...dataarr, second]);
        return  getRet(panel, second)
    })
    _ret.sort((b,a)=> a.point-b.point)
    return _ret[0]
}

function getDmgDps(data, rate=1){
    let criticalRate = data.criticalRate
    if(criticalRate > 100){criticalRate = 100}
    let baseat = data.base * (1 + data.attRate/100) + data.fixedAtt;
    let bdmg = baseat * (1 + data.criticalStrike/100);
    let bdps = (criticalRate * 10 * bdmg + (1000-criticalRate * 10)*baseat)/1000
    let adddmg = bdps * (1 + data.dmgRate/100)
    return adddmg * rate
}

function getPanel(arr){
    let info = {name1:"",name2:""};
    arr.forEach((item, i)=>{
        if(item.name){
            info["name" + (i+1)] = item.name
        }
        for (const key in item) {
            if(key !== "name"){
                if(info[key]){
                    info[key] += item[key]
                } else {
                    info[key] = item[key]
                }
            }
        }
    })
    return info
}

function q (resistance) {
    if(resistance < 0) {
        return 1 - resistance/200
    } else if (resistance >=0 && resistance < 75){
        return 1 - resistance/100
    } else {
        return 1/(1+resistance/100*4)
    }
}

function df(youLv=0, eLv=0, td){
    return (100+youLv)/(100+youLv+(100+eLv)*(td? (100-td)/100 : 1))
}

// 固定攻击力 19  防御力23 生命值299 5.3% 
function calc_clips_normal (n) {
    let clips = [
        {
            fixedAtt: 19,
            attRate: 5.8,
            criticalRate: 3.9,
            criticalStrike:7.8
        },
        {
            attRate: 5.8,
            criticalRate: 3.9,
            criticalStrike:7.8
        },
        {
            fixedAtt: 19,
            criticalRate: 3.9,
            criticalStrike:7.8
        },
        {
            fixedAtt: 19,
            attRate: 5.8,
            criticalRate: 3.9,
            criticalStrike:7.8
        },
        {
            fixedAtt: 19,
            attRate: 5.8,
            criticalRate:n!=2? 0:3.9,
            criticalStrike:n!=2? 7.8:0
        }
    ]
    let data = {}
    clips.forEach(item => {
        for (const key in item) {
            data[key] = data[key]? (data[key]+item[key]) : item[key]
        }
    })
    return data
}

